#ifndef TSCISCONFIG_H
#define TSCISCONFIG_H


// 返回数组元素的个数
#define TabSize(tab)	sizeof(tab)/sizeof(tab[0])
// 权限配置
#define PINoKEY(enumVal) "PIN|"#enumVal
#define PINaKEY(enumVal) "PIN&"#enumVal
#define PINCTRL			 "PIN"
#define FORBIDEN		 "FORBIDEN"
#define FREECTRL		 "FREE"


// 文件类型
enum FILETYPE {
    BINARYFILE = 0xC4,			// 透明文件
    RECORDFILE = 0xC6,			// 变长记录文件
    CIRCLEFILE = 0xC7			// 循环文件
};
// 记录类型
enum RECORDTYPE {
    AN_LVAR = 0x10,	// AN不定长记录，右补十六进制‘0’
    BN_LVAR = 0x20,	// BN不定长格式，右补十六进制‘0’
    CN_LVAR = 0x30,	// CN不定长记录，右补十六进制‘F’
    BTLV	= 0x40,
    AN_TYPE	= 0x11,	// AN定长记录
    AN_CODE = 0x12,	// AN指定代码
    BN_TYPE = 0x21,	// BN格式
    CN_TYPE	= 0x31,	// CN定长记录
    CN_CODE	= 0x32,	// CN指定代码
    CN_DATE1= 0x33,	// CN生效期
    CN_DATE2= 0x34	// CN失效期
};

// 子记录
typedef struct RECORDEX
{
    unsigned char Id;			// 记录标志或记录号
    unsigned char Type;			// 记录类型
    unsigned char Len;			// 记录长度
    char     const    *Text;		// 数据项
}RecordEx;
// 记录信息
typedef struct FILERECORD
{
    unsigned char Id;			// 记录标志
    unsigned char Type;			// 记录类型
    unsigned char Len;			// 记录长度
    char     const    *Text;		// 数据项
    unsigned char Size;			// 关联记录条数
    RecordEx      *RecordExt;	// 关联记录
}FileRecord;
// 文件信息
typedef struct CARDFILE
{
    char	const	  *EF;			// 文件名
    unsigned char Type;			// 文件类型
    char    const     *RK;			// 读权限
    char    const     *UK;			// 写权限
    char    const     *Text;		// 描述
    unsigned int  Size;			// 记录文件代表记录条数，透明文件表示文件大小
    FileRecord   *Record;		// 记录信息
}CardFile;
// 卡结构目录
typedef struct CARDCIS
{
    char    const    *ADF;		// 应用目录
    char	const	*AID;		// 应用标识符
    char	const	*Text;		// 应用标签
    unsigned int	Size;		// 文件个数
    CardFile		*File;		// 基本文件
} SSSECIS;

struct TAGVAL
{
    unsigned int Tag;
    char *Val;
};

struct CISVAL {
    unsigned int		MI;
    unsigned int		SI;
    unsigned int		Size;
    TAGVAL	*TagVal;
};
// 单个文件密钥头信息表
typedef struct SSKEYDATA {
    char *KeyId;				// 密钥名称
    int KeyIndex;				// 密钥索引
    char *CmdHead;				// 更新密钥命令头
    char *KeyHead;				// 更新密钥头数据
    unsigned char KeyLen;		// 密钥长度
} SSKeyData;
// 密钥更新信息表单
typedef struct SSKEYUPDATETAB {
    char *AID;					// 文件ID
    unsigned char KeyNum;		// 文件更新密钥条数
    SSKeyData *KeyData;			// 文件更新密钥数据
} SSKeyUpdateTab;

// 金融数据分组表
struct PBOCDGI
{
    char* RecordNum;			// 记录号
    char* RecordName;			// 记录名称
};

// 金融数据分组表
struct PBOCCIS
{
    std::vector <PBOCDGI> pDGI;				// DGI号
};
// 获取软件版本
extern "C" char * iGetLibVer_TSCISCONFIG();
// 获取更新密钥表单数据
extern "C" SSKeyUpdateTab *iGetUpdateKeyInfo(char *pHisAtr, char *pCityCode, int iCardVer, int iKeyType, int *iTabSize, int *KeyLevel);
// 获取卡结构表单
extern "C" SSSECIS *iGetSsseCardInfo(int iCardVer, int *iTabSize);
// 获取代码表单
extern "C" long iGetSsseCodeInfo(char *pFilePath, int Id, int iOffset, char *pCodeText, CISVAL *pTab);
// 获取PSAM用户卡密钥索引（返回值：密钥的版本组数）
extern "C" int iGetSSKeyPsamIndex(char *pKeyId, unsigned char &UserId, unsigned char &PsamType, unsigned char &PsamId);
// 获取加密机用户卡密钥索引（返回值：密钥的版本组数）
extern "C" int iGetSSKeyHsmIndex(char *pKeyId, unsigned char &UserId, char *pHsmIds);
// 获取加密机地址（返回值：密钥的版本组数）
extern "C" int iGetSSKeyHsmAddr(char *pKeyId, unsigned char &UserId, int iAlgFlag, int &iHsmAddr);
// 获取固定密钥值（返回值：密钥的版本组数）
extern "C" int iGetSSFixKey(char *pKeyId, unsigned char &UserId, char *pFixKey);
// 特别权限配置
extern "C" int iGetCtrlOpt(char *pAtrHis, char *pAID, unsigned char &UserId);

// 获取金融数据分组表单
extern "C" long iGetPBOCCardInfo(std::map<std::string, std::string>& mssPBOC);

#endif // TSCISCONFIG_H
